package com.hernie.piggymall.order.service.impl;

import com.hernie.piggymall.order.entity.OrderReturnReasonEntity;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hernie.common.utils.PageUtils;
import com.hernie.common.utils.Query;

import com.hernie.piggymall.order.dao.OrderItemDao;
import com.hernie.piggymall.order.entity.OrderItemEntity;
import com.hernie.piggymall.order.service.OrderItemService;

@RabbitListener(queues = {"hello-java-queue"})
@Service("orderItemService")
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OrderItemEntity> implements OrderItemService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<OrderItemEntity> page = this.page(
                new Query<OrderItemEntity>().getPage(params),
                new QueryWrapper<OrderItemEntity>()
        );

        return new PageUtils(page);
    }

    /**
     * 监听消息
     * queues： 声明需要监听的所有队列
     *
     * 参数可以是以下类型
     *     Message message ：原生消息详细信息。消息头+消息体
     *     T<发送的消息的类型>, 如：OrderReturnReasonEntity content
     *     Channel channel : 当前传输数据的通道
     *
     * Queue：可以有很多人监听。只要收到消息，队列就会将此消息删除，并且只能有一个人收到消息
     * 场景：
     *      1）、同一个消息，只能有一个客户端收到
     *      1）、只有一消息完全处理完，方法运行结束，我们就可以接收到下一个消息
     */
//    @RabbitListener(queues = {"hello-java-queue"})
    @RabbitHandler
    public void recieveMessage(Message message, OrderReturnReasonEntity content, Channel channel) {
        byte[] body = message.getBody(); // 获取消息体
        MessageProperties messageProperties = message.getMessageProperties(); // 获取消息的属性信息（消息头）
        System.out.println("收到消息：" + message + "--类型：" + message.getClass());
        // deliveryTag ： channel内按顺序自增的
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        // 签收消息
        try {
            channel.basicAck(deliveryTag, false); //false表示只签收当前消息，非批量模式


            // 拒收消息
            // long deliveryTag【通道内消息标签】, boolean multiple[是否批量拒收], boolean requeue【拒收后是否重新入队列，如果为false，则消息会被丢弃，如果为true则会发回服务器重新入队】
            // requeue = true 后，消息回重新入队，消费者会再次尝试消费该消息，并且deliveryTag会继续自增
            channel.basicNack(deliveryTag, false, false);
            // long deliveryTag, boolean requeue
//            channel.basicReject();  // basicNack可以批量拒收，在对应的参数中传入false则和basicReject相同
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}